彻底搞懂var、let、const的区别 | 您所在的位置:网站首页 › have make let 区别 › 彻底搞懂var、let、const的区别 |
var、let、const都是js声明变量的方法,var是es5语法,存在变量提升,let和const是es6语法新提出的块级作用域概念,存在暂时性死区,没有变量提升机制。 一、var变量提升机制我们在全局作用域中或局部作用域中,使用var关键字声明的变量,都会被提升到该作用域的最顶部,这就是我们常说的变量提升 1、var在全局作用域的应用代码块1: console.log(a); //undefind var a = 1; console.log(a); //1等价于 代码块2: var a; console.log(a); //undefined a = 1; console.log(a); //1代码块2为计算机在执行代码块1程序的执行流程 代码块3: var a = 1; console.log(window.a); //1var在全局作用域声明的变量会挂载在window对象上,它会创建一个新的全局变量作为全局对象的属性,这种行为说不定会覆盖到window对象上的某个属性 2、var在局部作用域的应用未在局部加var声明的情况 代码块1: console.log(a); //严格模式下:Uncaught ReferenceError: a is not defined,非严格模式下:undefined console.log(window.a); //严格模式下:打印 window.a 也是 undefined function person(){ a = 1 console.log(a); //1 } person();等价于 代码块2: var a; console.log(a); //undefined function person(){ a = 1 console.log(a); //1 } person();代码块2为计算机在执行代码块1程序的执行流程 在局部加var声明的情况 代码块1: person(); console.log(a); //报错 Uncaught ReferenceError: a is not defined function person(){ var a = 1; console.log(a); //1 }等价于 代码块2: person(); console.log(a); //报错 Uncaught ReferenceError: a is not defined function person(){ var a; a = 1; console.log(a); //1 }代码块2为计算机在执行代码块1程序的执行流程 二、块级作用域let、constlet、const声明和var声明用法一样,不同点在于let、var声明的是变量,const声明的是常量。var存在变量提升,let、const不存在变量提升。var在全局作用域声明的变量会挂载在window对象上,它会创建一个新的全局变量作为全局对象的属性,这种行为说不定会覆盖到window对象上的某个属性,而let const声明的变量则不会有这一行为 1、let声明let声明的是变量,没有var那样的变量提升,let声明的变量只在当前作用域中有效 代码块1: console.log(a);//暂时性死区,报错 Unexpected identifier 'Uncaught' let a = 1; console.log(a);代码块2: { console.log(a); //暂时性死区,报错 Unexpected identifier 'Uncaught' let a = 1; console.log(a); }代码块3: { let a = 1; console.log(a); //1; } console.log(a); 访问不了内部变量,报错 Unexpected identifier 'Uncaught'代码块4: var a = 1; let a = 1; //不能重复声明 报错 Identifier 'a' has already been declared代码块5: var a = 1; //全局作用域 { let a = 1; // 代码块中声明,毫无影响 }代码块6: let a = 1; console.log(window.a); //undefined上述代码说明:let声明的变量没有变量提升,存在暂时性死区。如果在同一个作用域中某个变量已经存在,再次使用let关键字声明的话会报错。let声明的变量不会挂载到window对象上 2、const 声明const声明的是常量,常量不可以修改。常量定义必须初始化值,如果不初始化值就会报错。特别注意的一点是const变量不能修改指针,但是可以修改值,比如我们定义一个对象,我们就可以修改对象里的属性值,但是不可以重写整个对象。使用const声明的常量没有var那样的变量提升,const声明的常量只在当前作用域中有效 代码块1: { console.log(a); //暂时性死区,报错 Unexpected identifier 'Uncaught' const a = 1; console.log(a); }代码块2: { const a = 1; console.log(a); //1; } console.log(a); 访问不了内部变量,报错 Unexpected identifier 'Uncaught'代码块3: const a; console.log(a);//常量a未初始化 报错 Missing initializer in const declaration代码块4: const a = { b:1,c:2 }; a = {}; //不能修改对象指针, 报错 Assignment to constant variable代码块5: const a = { b:1,c:2 }; a = {b:2,c:1}; console.log(a); // Assignment to constant variable.代码块6: const a = 1; console.log(window.a); //undefined上述代码说明:const声明的变量不存在变量提升,存在暂时性死区,必须先声明并立即赋值,常量值不可以修改,对象可以修改值,不能修改指针。const声明的变量不会挂载到window对象上 |
CopyRight 2018-2019 实验室设备网 版权所有 |